package org.maitaole.controller;


import org.maitaole.commons.Constant;
import org.maitaole.entity.SysUser;
import org.maitaole.model.Result;
import org.maitaole.service.ISysUserService;
import org.maitaole.utils.BCryptPasswordEncoder;
import org.maitaole.utils.PasswordEncoder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/cas/login")
public class LoginController {

    @Resource
    private ISysUserService sysUserService;

    private PasswordEncoder encoder = new BCryptPasswordEncoder();

    /**
     * 注册密码的处理都是采取加盐的方式：
     *      1) 1 ->  e1  0a dc 39 49 ba 59  ab be  56 e0 57 f2 0f  88  3e
     *      2) 生成一个长度16位的随机字符串。 abcdefghijklmnxz
     *      3) 将随机值撒到密码的值中: e1 a 0a b dc c, 每两位撒一个随机值，最终结果是 48位
     *      4) 对48位的字符串再次 md5 计算 -> 长度位 32 位  9f61408e3afb633e50cdf1b20de6f466
     *      5) z 9f x 61 n 40 m 8e l 3a k fb j 63 i 3e h 50 g cd f f1 e b2 d 0d c e6 b f4 a 66
     *      6) 将第5步的结果放到数据库中。
     * 登录：
     *     1) 将密码查询出来。
     *     2) 将盐值抽取出来： bcdefghijklmnxz   9f61408e3afb633e50cdf1b20de6f466
     *     3) 将用户登录的明文做md5运算： e1  0a dc 39 49 ba 59  ab be  56 e0 57 f2 0f  88  3e
     *     4) 按照注册的时候 第 3)到第 4) 步，进行运算，然后比较两个密文。
     * @param username
     * @param password
     * @return
     */
    @PostMapping
    public Result login(@RequestParam String username, @RequestParam String password, HttpSession session) {
        SysUser sysUser = sysUserService.findUserByUsername(username);
        if(null == sysUser || !encoder.matches(password, sysUser.getPassword())) {  // 如果为空表示没有对应的用户
            return Result.buildFail("用户名或密码错误.");
        }else {  // 成功
            session.setAttribute(Constant.USER_INFO_ATTR, sysUser);
            return Result.buildSuccess(sysUser.getUsername());
        }
    }
}
